package com.ruoyi.file.utils;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.file.domain.SysStorageConfig;
import com.ruoyi.file.domain.vo.UploadTokenVO;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;

/**
 * 响应构建工具类
 * 统一处理各种响应对象的构建逻辑
 *
 * @author ruoyi
 */
@Slf4j
public class ResponseUtils {

    /**
     * 构建文件上传成功响应
     *
     * @param filePath   文件路径
     * @param fileName   文件名
     * @param fileSize   文件大小
     * @param fileUrl    文件访问URL
     * @param config     存储配置
     * @return 统一的响应对象
     */
    public static UploadTokenVO buildUploadSuccessResponse(String filePath, String fileName, 
                                                          Long fileSize, String fileUrl, 
                                                          SysStorageConfig config) {
        UploadTokenVO response = new UploadTokenVO();
        response.setFilePath(filePath);
        response.setFileName(fileName);
        response.setFileSize(fileSize);
        response.setUploadUrl(fileUrl); // 使用uploadUrl字段存储最终的访问URL
        response.setConfigId(config.getConfigId());
        response.setBucketName(config.getBucketName());
        response.setMaxFileSize(config.getMaxFileSize());
        response.setEndpoint(config.getEndpoint());
        response.setRegion(config.getRegion());
        
        // 处理允许的文件类型
        if (StringUtils.isNotBlank(config.getAllowedFileTypes())) {
            response.setAllowedTypes(Arrays.asList(config.getAllowedFileTypes().split(",")));
        }
        
        return response;
    }

    /**
     * 构建标准的成功响应
     *
     * @param message 成功消息
     * @param data    响应数据
     * @return AjaxResult
     */
    public static AjaxResult success(String message, Object data) {
        return AjaxResult.success(message, data);
    }

    /**
     * 构建标准的成功响应（无数据）
     *
     * @param message 成功消息
     * @return AjaxResult
     */
    public static AjaxResult success(String message) {
        return AjaxResult.success(message);
    }

    /**
     * 构建标准的错误响应
     *
     * @param message 错误消息
     * @return AjaxResult
     */
    public static AjaxResult error(String message) {
        return AjaxResult.error(message);
    }

    /**
     * 构建带异常日志的错误响应
     *
     * @param message   错误消息
     * @param exception 异常对象
     * @param operation 操作描述
     * @return AjaxResult
     */
    public static AjaxResult errorWithLog(String message, Exception exception, String operation) {
        log.error("{}失败: {}", operation, exception.getMessage(), exception);
        return AjaxResult.error(message + ": " + exception.getMessage());
    }

    /**
     * 处理通用的Controller异常
     *
     * @param e         异常对象
     * @param operation 操作描述
     * @return AjaxResult
     */
    public static AjaxResult handleException(Exception e, String operation) {
        if (e instanceof com.ruoyi.common.exception.ServiceException) {
            log.error("{}失败: {}", operation, e.getMessage());
            return AjaxResult.error(e.getMessage());
        } else {
            log.error("{}失败: {}", operation, e.getMessage(), e);
            return AjaxResult.error(operation + "失败: " + e.getMessage());
        }
    }
}
